﻿using System;

namespace Wisdom.Core
{
    /// <summary>
    /// 描述服务加载接口.
    /// </summary>
    public interface IServiceLocator : IServiceProvider
    {
        /// <summary>
        /// 获得指定服务类型的对象
        /// </summary>
        /// <typeparam name="T">服务对象的类型.</typeparam>
        /// <returns>服务对象实例.</returns>
        T GetService<T>();

        /// <summary>
        /// 获得服务类型对象，并overrided提供的参数
        /// </summary>
        /// <typeparam name="T">服务对象的类型.</typeparam>
        /// <param name="overridedArguments">当获得服务对象时将overrided参数.</param>
        /// <returns>服务对象实例.</returns>
        T GetService<T>(object overridedArguments);
        /// <summary>
        /// 获得指定服务类型的对象，并overrided提供的参数
        /// </summary>
        /// <param name="serviceType">服务对象类型.</param>
        /// <param name="overridedArguments">当获得服务对象时将overrided参数.</param>
        /// <returns>服务对象实例.</returns>
        object GetService(Type serviceType, object overridedArguments);
        /// <summary>
        /// 分解指定类型所有的对象.
        /// </summary>
        /// <param name="serviceType">需要分解的类型</param>
        /// <returns>一个<see cref="System.Array"/>对象  包括所有分解的对象</returns>
        Array GetServices(Type serviceType);

        /// <summary>
        /// 分解指定类型所有的对象.
        /// </summary>
        /// <typeparam name="T">需要分解的对象类型.</typeparam>
        /// <returns> 包括所有分解的对象.</returns>
        T[] GetServices<T>();
        /// <summary>
        /// 返回一个<see cref="Boolean"/>值，判断指定类型是否进行了注册.
        /// </summary>
        /// <typeparam name="T">要判断的类型.</typeparam>
        /// <returns>True 已注册, 未注册, false.</returns>
        bool Registered<T>();
        /// <summary>
        /// 返回一个 <see cref="Boolean"/> 值，判断指定类型是否进行了注册.
        /// </summary>
        /// <param name="type">要判断的类型.</param>
        /// <returns>True 已注册, 未注册, false.</returns>
        bool Registered(Type type);
    }
}